package com.atguigu.tingshu.album.api;

import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.login.TsLogin;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.atguigu.tingshu.vo.album.AlbumStatVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.simpleframework.xml.core.Validate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "专辑管理")
@RestController
@RequestMapping("api/album/albumInfo")
@SuppressWarnings({"all"})
public class AlbumInfoApiController {

    @Autowired
    private AlbumInfoService albumInfoService;

    /**
     * 通过专辑Id 获取到专辑状态信息
     * @param albumId
     * @return
     */
    @GetMapping("/getAlbumStatVo/{albumId}")
    public Result<AlbumStatVo> getAlbumStatVo(@PathVariable Long albumId){
        //  调用服务层方法;
        AlbumStatVo albumStatVo = albumInfoService.getAlbumStatVo(albumId);
        //  返回数据
        return Result.ok(albumStatVo);
    }

    /**
     * Request URL:  http://localhost/api/album/albumInfo/saveAlbumInfo
     * Request Method: POST
     * 保存专辑信息
     *
     * @param albumInfo
     * @return
     */
    @TsLogin
    @Operation(summary = "保存专辑信息")
    @PostMapping("/saveAlbumInfo")
    //@RequestBody：表示方法参数albumInfoVo是从HTTP请求体中获取的JSON数据，并自动转换为AlbumInfoVo对象。
    //@Validate：表示对albumInfoVo进行校验，确保其符合定义的验证规则。
    public Result saveAlbumInfo(@RequestBody @Validate AlbumInfoVo albumInfoVo) {
        //获取当前用户的ID。如果AuthContextHolder.getUserId()返回null，则默认设置用户ID为1，否则使用实际的用户ID。
        //	保存专辑的时候，应该要在登录的情况下保存！ 因为现在还没有写登录！ 如果写了登录，用户Id 存储在本地线程中！
        Long userId = AuthContextHolder.getUserId() == null ? 1l : AuthContextHolder.getUserId();
        //	调用服务层方法:
        albumInfoService.saveAlbumInfo(albumInfoVo, userId);
        //	返回数据
        return Result.ok();
    }

    /**
     * 获取专辑列表
     *Request URL: http://localhost/api/album/albumInfo/findUserAlbumPage/1/10
     * Request Method: POST
     * @param pageNum
     * @param pageSize
     * @return
     */
    @TsLogin
    @Operation(summary = "获取专辑列表")
    @PostMapping("findUserAlbumPage/{pageNum}/{pageSize}") //findUserAlbumPage/1/10
    public Result findUserAlbumPage(@PathVariable("pageNum") Long pageNum,
                                    @PathVariable("pageSize") Long pageSize,
                                    @RequestBody AlbumInfoQuery albumInfoQuery) {
        //{"page":1,"limit":10,"status":""}  AlbumInfoQuery:接收状态
        //  获取正在查询的用户Id. (AuthContextHolder 是一个用于在当前线程中存储和获取用户信息的工具类。)
        //  确保了即使在没有登录的情况下（即AuthContextHolder.getUserId()返回null），也能有一个默认的用户ID（这里设置为1），从而避免在后续操作中出现空指针异常。
        //AuthContextHolder.getUserId()返回null（即用户未登录或未获取到用户ID）|| AuthContextHolder.getUserId()返回一个非null的值（即成功获取到用户ID）
        Long userId = AuthContextHolder.getUserId() == null ? 1l : AuthContextHolder.getUserId();
        albumInfoQuery.setUserId(userId);
        // 创建一个Page对象，用于封装分页查询结果
        // Page<AlbumListVo>：声明了一个泛型变量albumListVoPage，其类型是Page，泛型参数是AlbumListVo。
        // （通过new Page<>(pageNum, pageSize)创建了一个分页对象albumListVoPage）
        Page<AlbumListVo> albumListVoPage = new Page<>(pageNum, pageSize); //mybatis的分页插件
        //	调用服务层方法
        IPage<AlbumListVo> iPage = albumInfoService.findUserAlbumPage(albumListVoPage,albumInfoQuery);
        return Result.ok(iPage);
    }

    /**
     * 根据id删除专辑
     * Request URL: http://localhost/api/album/albumInfo/removeAlbumInfo/1616
     *     Request Method: DELETE
     * @param id
     * @return
     */
    @Operation(summary = "根据id删除专辑")
    @DeleteMapping("/removeAlbumInfo/{albumId}")
    public Result removeAlbumInfo(@PathVariable("albumId") Long albumId) {
        albumInfoService.removeAlbumInfo(albumId);
        return Result.ok();
    }

    /**
     * 根据专辑Id获取专辑对象数据
     * Request URL: http://localhost/api/album/albumInfo/getAlbumInfo/1616
     * Request Method: GET
     * @param albumId
     * @return
     */
    @Operation(summary = "根据专辑Id获取专辑对象数据")
    @GetMapping("/getAlbumInfo/{albumId}")
    public Result getAlbumInfo(@PathVariable("albumId") Long albumId) {
        AlbumInfo albumInfo = albumInfoService.getAlbumInfo(albumId);
        return Result.ok(albumInfo);
    }

    /**
     * 更新专辑信息
     * Request URL: http://localhost/api/album/albumInfo/updateAlbumInfo/1616
     * Request Method: PUT
     * @param albumInfoVo
     * @param albumId
     * @return
     */
    @Operation(summary = "更新专辑信息")
    @PutMapping("/updateAlbumInfo/{albumId}")
    public Result updateAlbumInfo(@PathVariable("albumId") Long albumId,
                                @RequestBody AlbumInfoVo albumInfoVo) {
        albumInfoService.updateAlbumInfo(albumId, albumInfoVo);
        return Result.ok();
    }


    /**
     * 查询用户专辑列表
     * Request URL: http://localhost/api/album/albumInfo/findUserAllAlbumList
     * Request Method: GET
     * @return
     */
    @Operation(summary = "查询用户专辑列表")
    @GetMapping("/findUserAllAlbumList")
    public Result findUserAllAlbumList(){
        //  哪个用户查询获取用户Id
        Long userId = AuthContextHolder.getUserId() == null ? 1l : AuthContextHolder.getUserId();
        //  调用服务层方法: album_info;
        //  select * from album_info where user_id = 1;
        List<AlbumInfo> albumInfoList = albumInfoService.findUserAllAlbumList(userId);
        //	返回数据
        return Result.ok(albumInfoList);
    }
}

